package com.jackeysun.app_widget

import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.Rect
import android.util.AttributeSet
import android.view.View

/**
 *   Created by sunxunchao on 2021/11/25.
 */

class CustomView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
    var rect = Rect()
    val content =
        "testtesttesttesttesssssssssssssssssst"

    init {


    }


    /**
     * MeasureSpec类是由父控件传递给子控件的
     * 是父控件对子控件的约束
     * UNSPECIFIED：父控件不强加任何约束给子控件，它可以是它想要任何大小
     * EXACTLY：父控件已为子控件确定了一个确切的大小，孩子将被给予这些界限，不管子控件自己希望的是多大
     * AT_MOST：父控件会给子控件尽可能大的尺寸
     */

    /**
     *----------------------------------------------------------------------------------------------
     *|约束	                | 布局参数	            | 值	        |说明                           |
     *|--------------------------------------------------------------------------------------------|
     *|UNSPECIFIED(未指定)	|	                    | 0	            |父控件没有对子控件施加任何约束，子控|
     *|                     |                       |               |件可以得到任意想要的大小（使用较少）|
     *|--------------------------------------------------------------------------------------------|
     *|EXACTLY(完全)	        |match_parent/具体宽高值	| 1073741824	|父控件给子控件决定了确切大小，子控件|
     *|                     |                       |               |将被限定在给定的边界里而忽略它本身大|
     *|                     |                       |               |小。特别说明如果是填充父窗体，说明  |
     *|                     |                       |               |父控件已经明确知道子控件想要多大的尺|
     *|                     |                       |               |寸了（就是剩余的空间都要了）栗子：碗|
     *|                     |                       |               |柜最大的碗就这么大，菜有多少都只能盛|
     *|                     |                       |               |到这个最大的碗里，盛不下的我就管不了|
     *|                     |                       |               |了（吃掉或者倒掉）               |
     *|--------------------------------------------------------------------------------------------|
     *|AT_MOST(至多)	        |wrap-content	        | -2147483648	|子控件至多达到指定大小的值。包裹内容|
     *|                     |                       |               |就是父窗体并不知道子控件到底需要多大|
     *|                     |                       |               |尺寸（具体值），需要子控件自己测量之|
     *|                     |                       |               |后再让父控件给他一个尽可能大的尺寸以|
     *|                     |                       |               |便让内容全部显示但不能超过包裹内容的|
     *|                     |                       |               |大小栗子：碗柜有各种大小的碗，菜少就|
     *|                     |                       |               |拿小碗放，菜多就拿大碗放，但是不能浪|
     *|                     |                       |               |费碗的容积，要保证碗刚好盛满菜     |
     *----------------------------------------------------------------------------------------------
     */

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
        val textWidth = rect.width() + paddingLeft + paddingRight //文本的宽度
        val textHeight = rect.height() + paddingTop + paddingBottom //文本的宽度
        //保存测量宽度和测量高度
        setMeasuredDimension(
            measure(minimumWidth, textWidth, widthMeasureSpec),
            measure(minimumHeight, textHeight, heightMeasureSpec)
        )
    }

    private fun measure(miniSize: Int, defaultSize: Int, measureSpec: Int): Int {

        var result: Int = miniSize
        val specMode = MeasureSpec.getMode(measureSpec)
        val specSize = MeasureSpec.getSize(measureSpec)
        when (specMode) {
            MeasureSpec.EXACTLY -> {
                result = specSize
            }
            MeasureSpec.AT_MOST -> {
                result = defaultSize
            }
            MeasureSpec.UNSPECIFIED -> {
                result = miniSize
            }
        }
        return result
    }

    var paint = Paint().apply {
        style = Paint.Style.FILL
        color = Color.RED
        isAntiAlias = true
        isDither = true
        strokeWidth = 4f
        textSize = 50f
        textAlign = Paint.Align.CENTER
        getTextBounds(content, 0, content.length, rect)
    }

    override fun onDraw(canvas: Canvas?) {
        canvas?.let {
//            it.drawText(content, rect.left, rect.top,rect.right, rect.bottom, paint)
            it.drawText(
                content,
                getWidth().toFloat() / 2 - rect.width() / 2,
                getHeight().toFloat() / 2 + rect.height() / 2,
                paint
            )
        }


//        //获取控件circleView宽高
//        val width = getWidth();
//        val height = getHeight();
//
//        //圆心坐标
//        val cx = width / 2;
//        val cy = height / 2;
//
//        //取两者最小值作为圆的直径
//        val minSize = Math.min(width, height);
//
//        canvas?.drawColor(Color.WHITE);//设置画布颜色
//        paint.setColor(Color.RED);//设置画笔颜色
//        paint.setStyle(Paint.Style.STROKE);//设置圆为空心
//        paint.setStrokeWidth(3.0f);//设置线宽
//
//        //cx,cy坐标点是相对于MyCircleView的左上角顶点坐标
//        canvas?.drawCircle(cx.toFloat(), cy.toFloat(), minSize.toFloat() / 2, paint);
    }

}